package com.blackhorse.utils;

import org.aspectj.lang.ProceedingJoinPoint;

/**
 * 用于记录日志的工具类
 * 里面提供了公共的代码
 */
public class Logger {

    //计划让该方法在切入点（业务层）方法执行之前执行
    //前置通知
    public void beforePrintLog(){
        System.out.println("Logger中的beforePrintLog方法开始记录日志...");
    }

    //后置通知
    public void afterReturningPrintLog(){
        System.out.println("Logger中的afterReturningPrintLog方法开始记录日志...");
    }

    //异常通知
    public void afterThrowingPrintLog(){
        System.out.println("Logger中的afterThrowingPrintLog方法开始记录日志...");
    }

    //最终通知
    public void afterPrintLog(){
        System.out.println("Logger中的afterPrintLog方法开始记录日志...");
    }

    /**环
     * 绕通知
     * 使用Spring环绕通知时，需要调用ProceedingJoinPoint接口中的proceed()方法
     * 以指定切入到方法执行，否则将只有通知方法执行，相当于动态代理中的method.invoke(args)
     *
     * Spring会创建实现类为我们调用，我们可以在通知方法中手动编码指定切入点方法的增强方式
     * @param pjp
     * @return
     */
    public Object arroundPrintLog(ProceedingJoinPoint pjp){
        Object rtValue = null;
        try {
            Object[] args = pjp.getArgs();//切入点方法的参数
            System.out.println("Logger中的arroundPrintLog方法开始记录日志...前置");
            rtValue = pjp.proceed(args);//明确调用业务层方法（切入点方法）
            System.out.println("Logger中的arroundPrintLog方法开始记录日志...后置");
            return rtValue;
        } catch (Throwable throwable) {//不能用catch Exception
            throwable.printStackTrace();
            System.out.println("Logger中的arroundPrintLog方法开始记录日志...异常");
            return null;
        }finally {
            System.out.println("Logger中的arroundPrintLog方法开始记录日志...最终");
        }
    }
}
